#include "taskqueue.h"
#include <QDebug>

// 静态变量的声明
TaskQueue TaskQueue::m_queue;

TaskQueue *TaskQueue::getInstance()
{
    return &m_queue;
}

void TaskQueue::addTask(Task &t)
{
    // 加锁
    m_mutex.lock();
    // 添加任务到任务队列对象中
    m_taskQ.enqueue(t);
    // 解锁
    m_mutex.unlock();
    // 如果消费者线程已经被阻塞了, 唤醒消费者线程
    m_cond.wakeAll();
}

void TaskQueue::addTask(callback func, void *arg)
{
    Task t;
    // 加锁
    m_mutex.lock();
    t.function = func;
    t.arg = arg;
    // 添加任务到任务队列对象中
    m_taskQ.enqueue(t);
    // 解锁
    m_mutex.unlock();
    // 如果消费者线程已经被阻塞了, 唤醒消费者线程
    m_cond.wakeAll();

}

Task TaskQueue::takeTask()
{
    Task t;
    m_mutex.lock();
    while(1)
    {
        // 当队列中有任务的时候, 从队列中取出一个任务
        if(m_taskQ.size() > 0)
        {
            // 取出新的任务跳出循环
            t = m_taskQ.dequeue();
            break;
        }
        else
        {
            // 没有任务了, 阻塞当前线程
            qDebug() << "任务队列中已经没有任务了, 强迫线程阻塞...";
            m_cond.wait(&m_mutex);
            qDebug() << "添加了新的任务, 阻塞解除了, 继续去任务队列中取新的任务...";
        }
    }
    m_mutex.unlock();
    return t;
}

int TaskQueue::taskNumber()
{
    m_mutex.lock();
    int size = m_taskQ.size();
    m_mutex.unlock();
    return size;
}

void TaskQueue::taskClear()
{
    m_mutex.lock();
    m_taskQ.clear();
    m_mutex.unlock();
}

TaskQueue::TaskQueue()
{
}
